perm filename CHECK[SS,SYS] blob
sn#008322 filedate 1977-05-14 generic text, type T, neo UTF8
00100 TITLE CHECK CHECK SUM A USER'S DISK AREA.
00200 SUBTTL R.E. GORIN 24 OCTOBER 71
00300
00400 IFDEF FOR,<MACRO←←0;>MACRO==1 ;PROCESSOR SELECTOR
00500
00600
00700
00800
00900 IFE MACRO,<
01000 DEFINE DEF(A,B)<
01100 A←B>
01200 DEFINE SDEF(A,B)<
01300 A←←B>
01400 >
01500 IFG MACRO,<
01600 DEFINE DEF(A,B)<
01700 A=B>
01800 DEFINE SDEF(A,B)<
01900 A==B>
02000 >
02100
02200 EXTERN JOBFF,JOBREL
02300
02400 OPDEF RESET [CALLI]
02500 OPDEF SWAP [CALLI 400004]
02600 OPDEF EXIT [CALLI 12]
02700 OPDEF GETPPN [CALLI 24]
02800 OPDEF CORE [CALLI 11]
02900 OPDEF TTCALL [51B8]
03000 OPDEF OUTCHR [TTCALL 1,]
03100 OPDEF OUTSTR [TTCALL 3,]
03200
03300 SDEF(PDLEN,50) ;SIZE OF PUSH-DOWN LIST
03400 SDEF(DSK,15)
03500 SDEF(RPG,17)
03600 SDEF(FILE,14)
03700
03800
03900 DEF(FL,0) ;THE ACCUMULATOR DEFINITIONS
04000 DEF(A,1)
04100 DEF(B,2)
04200 DEF(C,3)
04300 DEF(D,4)
04400 DEF(W,5)
04500 DEF(X,6)
04600 DEF(Y,7)
04700 DEF(Z,10)
04800 DEF(K,11)
04900 DEF(L,12)
05000 DEF(M,13)
05100 DEF(N,14)
05200 DEF(P,17)
05300
00100 SUBTTL DATA STORAGE FOR CHECK
00200 DSKBUF: BLOCK 3
00300 SAVEPD: 0 ;TEMP STORE FOR PDL POINTER
00400 CIBUF: BLOCK 3 ;BUFFER HEADS FOR CHECKSUM
00500 COBUF: BLOCK 3 ;BUFFER HEADS FOR CHECKSUM
00600 CLEN: 0 ;
00700 FIBUF: BLOCK 3
00800 FLEN: 0
00900 UFDLEN: 0
01000 FPTR: 0
01100 FLOC: 0
01200 FILBUF: BLOCK 9*205
01300 CHKIBF:
01400 CHKOBF: BLOCK 2*205
01500 LBLOCK: BLOCK 4
01600 PDLIST: BLOCK PDLEN ;PUSH DOWN LIST
01700 USER: 0
01800 RPGSW: 0
01900 GOD: ' 1 1'
02000 ACSAVE: BLOCK 20
00100 SUBTTL ALARUMS AND DIVERSIONS
00200 NODISK: OUTSTR [ASCIZ/
00300 CAN'T INIT THE DISK!
00400 /]
00500 JRST CHKXIT
00600 NOCORE: OUTSTR [ASCIZ/
00700 CORE UUO HAS FAILED!
00800 /]
00900 JRST CHKXIT
01000 NOUFD: OUTSTR [ASCIZ/
01100 I CAN'T FIND THE UFD!
01200 /]
01300 JRST CHKXIT
01400 UFDERR: OUTSTR [ASCIZ/
01500 UNEXPECTED EOF WHILE READDING UFD!
01600 /]
01700 JRST CHKXIT ;EXIT FROM CHECKSUM KLUGE
01800 DDEX: OUTSTR [ASCIZ/DATA ERROR ON INPUT FILE
01900 /]
02000 JRST CHKXIT
02100 CKENTF: OUTSTR [ASCIZ/
02200 CAN'T ENTER CHECKSUM FILE!
02300 /]
02400 JRST CHKXIT
00100 subttl File checksum routine to test for garbaged files. J.A.M
00200 chkxit: move p,savepd ;restore stack pointer
00300 popj p, ;return
00400 CHECK: movem p,savepd ;save stack pointer
00500 OUTSTR [asciz/Checksum being computed...
00600 /]
00700 move a,user ;get users name
00800 movem a,lblock ;save for UFD
00900 movsi a,'UFD' ;lookup
01000 movem a,lblock+1 ;...
01100 setzm lblock+2 ;...
01200 move a,GOD ;god's name
01300 movem a,lblock+3 ;stuff in lookup block
01400 init dsk,210 ;init the disk
01500 sixbit /DSK/ ;for the ufd
01600 xwd 0,dskbuf
01700 jrst nodisk
01800 inbuf dsk,2 ;make buffers
01900 lookup dsk,lblock ;lookup the ufd
02000 jrst noufd ;this can't happen
02100 movs a,lblock+3 ;get - word count
02200 movem a,ufdlen ;save here
02300 move a,[sixbit /CKSUM/] ;make lookup block for checksum
02400 movem a,lblock ;
02500 movsi a,'DAT'
02600 movem a,lblock+1
02700 setzm lblock+2
02800 move a,user
02900 movem a,lblock+3
03000 init rpg,210 ;open channel for checksum file io
03100 sixbit /DSK/
03200 xwd cobuf,cibuf
03300 jrst nodisk
03400 hrrz a,jobff
03500 movem a,fptr
03600 movem a,floc
03700 lookup rpg,lblock
03800 jrst nockf
03900 movs a,lblock+3
04000 movem a,z
04100 movem a,clen
04200 movei a,chkibf
04300 exch a,jobff
04400 inbuf rpg,2
04500 exch a,jobff
04600 s3: pushj p,cget
04700 jrst [hrrz a,floc
04800 setzm b
04900 s5: skipn (a)
05000 jrst [came b,1(a)
05100 jrst ckerr
05200 movem a,fptr
05300 jrst nockf]
05400 jumpg z,ckerr
05500 add b,(a)
05600 add b,1(a)
05700 add b,2(a)
05800 add b,3(a)
05900 add b,4(a)
06000 addi a,5
06100 addi z,5
06200 jrst s5]
06300 movem a,@fptr
06400 aos a,fptr
06500 hrrz b,jobrel
06600 camg a,b
06700 jrst s3
06800 addi b,2000
06900 core b,
07000 jrst ckerr
07100 jrst s3
07200
07300 ckerr: hrrz a,floc
07400 movem a,fptr
07500 nockf: pushj p,rdufd
07600 jrst xdone
07700 movem a,lblock
07800 pushj p,rdufd
07900 jrst ufderr
08000 hllzm a,lblock+1
08100 pushj p,rdufd
08200 jrst ufderr
08300 pushj p,rdufd
08400 jrst ufderr
08500 setzm lblock+2
08600 move a,user
08700 movem a,lblock+3
08800 move a,lblock
08900 hllz b,lblock+1
09000 camn a,[sixbit /CKSUM/]
09100 came b,[sixbit /DAT /]
09200 jumpn a,s9
09300 jrst nockf
09400
09500 s9: init file,210
09600 sixbit /DSK/
09700 xwd fibuf,fibuf
09800 jrst nodisk
09900 lookup file,lblock
10000 jrst [hrrz a,lblock
10100 cain a,10
10200 jrst s7
10300 jrst nockf]
10400 movs a,lblock+3
10500 movem a,flen
10600 movei a,filbuf
10700 exch a,jobff
10800 inbuf file,9
10900 movem a,jobff
11000 setzm b
11100 cloop: pushj p,fget
11200 jrst cdone
11300 addm a,b
11400 jrst cloop
11500
11600 s7: close file,
11700 setzm lblock+2
11800 move a,user
11900 movem a,lblock+3
12000 hllzs lblock+1
12100 enter file,lblock
12200 jrst nockf
12300 setzm lblock
12400 rename file,lblock
12500 jrst nockf
12600 releas file,
12700 jrst nockf
12800
12900 cdone: hrrz a,floc
13000 move c,lblock
13100 hllz d,lblock+1
13200 move x,lblock+1
13300 move y,lblock+2
13400 move z,lblock+3
13500 ckl: caml a,fptr
13600 jrst cknf
13700 came c,(a)
13800 jrst [
13900 ckc: addi a,5
14000 jrst ckl]
14100 hllz w,1(a)
14200 came d,w
14300 jrst ckc
14400 camn x,1(a)
14500 came y,2(a)
14600 jrst update
14700 came z,3(a)
14800 jrst update
14900 camn b,4(a)
15000 jrst nockf
15100 outstr [asciz/
15200 ππ ππ checksum failure: /]
15300 pushj p,tfn
15400 jrst nockf
15500
15600 cknf: hrrz a,jobrel
15700 subi a,6
15800 camle a,fptr
15900 jrst cknf1
16000 hrrz a,jobrel
16100 addi a,2000
16200 core a,
16300 jrst nocore
16400 cknf1: move a,fptr
16500 movem c,(a)
16600 movem x,1(a)
16700 movem y,2(a)
16800 movem z,3(a)
16900 movem b,4(a)
17000 addi a,5
17100 movem a,fptr
17200 jrst nockf
17300
17400 update: movem x,1(a)
17500 movem y,2(a)
17600 movem z,3(a)
17700 movem b,4(a)
17800 addi a,5
17900 jrst nockf
18000
18100 xdone: move a,[sixbit /CKSUM/]
18200 movem a,lblock
18300 movsi a,'DAT'
18400 movem a,lblock+1
18500 setzm lblock+2
18600 move a,user
18700 movem a,lblock+3
18800 enter rpg,lblock
18900 jrst ckentf ;checksum file enter failed
19000
19100
19200 movei a,chkobf
19300 exch a,jobff
19400 outbuf rpg,2
19500 exch a,jobff
19600 hrrz c,floc
19700 setzm b
19800 s8: caml c,fptr
19900 jrst [setzm a
20000 pushj p,cput
20100 move a,b
20200 pushj p,cput
20300 close rpg,
20400 releas rpg,
20500 jrst chkxit]
20600 add b,(c)
20700 move a,(c)
20800 pushj p,cput
20900 aoja c,s8
21000
21100
21200 ; IO routines
21300
21400
21500
21600 cget: aosle clen
21700 popj p,
21800 sosg cibuf+2
21900 in rpg,
22000 jrst [ildb a,cibuf+1
22100 jrst cpopj1]
22200
22300 jrst ddex
22400
22500 fget: aosle flen
22600 popj p,
22700 sosg fibuf+2
22800 in file,
22900 jrst [ildb a,fibuf+1
23000 jrst cpopj1]
23100
23200 OUTSTR [asciz/Data error in file: /]
23300 pushj p,tfn
23400 popj p,
23500
23600 CPOPJ1: AOS (P)
23700 POPJ P,
23800 cput: sosg cobuf+2
23900 out rpg,
24000 jrst [idpb a,cobuf+1
24100 popj p,]
24200 OUTSTR [asciz/Checksum file output error
24300 /]
24400 jrst chkxit
24500
24600 tfn: move a,[point 6,lblock]
24700 movei b,6
24800 tfn1: ildb c,a
24900 jumpe c,tfn2
25000 addi c,"A"-'A'
25100 OUTCHR c
25200 tfn2: sojg b,tfn1
25300 hllz c,lblock+1
25400 jumpe c,tfn3
25500 OUTSTR [asciz ⊗.⊗]
25600 movei b,3
25700 tfn4: ildb c,a
25800 jumpe c,tfn5
25900 addi c,"A"-'A'
26000 OUTCHR c
26100 tfn5: sojg b,tfn4
26200 tfn3: OUTSTR [asciz ⊗
26300 ⊗]
26400 popj p,
26500 rdufd: aosle ufdlen
26600 popj p,
26700 sosle dskbuf+2
26800 jrst rdufd1
26900 input dsk,
27000 statz dsk,740000
27100 jrst ufddde
27200 statz dsk,20000
27300 popj p,
27400 rdufd1: ildb a,dskbuf+1
27500 jrst cpopj1
27600 ufddde: OUTSTR [asciz/UFD input error.
27700 /]
27800 popj p,
00100 SUBTTL INITIALIZATION
00200 BEGIN: TDZA FL,FL
00300 SETO FL,
00400 MOVEM FL,RPGSW
00500 SKIPE RPGSW
00600 JRST SETRPG
00700 SETZ A,
00800 GETPPN A,
00900 JFCL
01000 MOVEM A,USER
01100 RESET
01200 MOVE P,[IOWD PDLEN,PDLIST]
01300 PUSHJ P,CHECK
01400 EXIT
01500 SETRPG: MOVEM A,USER
01600 MOVE A,[XWD 2,ACSAVE]
01700 BLT A,ACSAVE+15 ;SAVE SOME AC'S
01800 RESET
01900 MOVE P,[IOWD PDLEN,PDLIST]
02000 PUSHJ P,CHECK
02100 MOVE A,[XWD ACSAVE,2]
02200 BLT A,17
02300 CAME B,['LOGRUN'] ;DO WE HAVE A PROGRAM TO RUN?
02400 EXIT ;NO
02500 MOVEI A,RUNBLK
02600 SWAP A,
02700 EXIT
02800 RUNBLK: 'SYS '
02900 'LOGRUN'
03000 'DMP '
03100 0
03200 0
03300 END BEGIN